﻿// ----------------------------------------------------------------------------------------
// Author:                    Magaly Vargas y Joaquín López
// Company:                   ALBALIA INTERACTIVA S.L.
// Assembly version:          1.0.0.0
// Date:                      22/02/2010
// Time:                      12:00
// Solution Name:             OffInvoiceWordAddIn
// Solution Filename:         OffInvoiceWordAddIn
// Solution FullFilename:     C:\Desarrollo\OffInvoiceWordAddIn
// Project Name:              OffInvoiceWordAddIn
// Project Filename:          OffInvoiceWordAddIn.csproj
// Project FullFilename:      C:\Desarrollo\OffInvoiceWordAddIn\OffInvoiceWordAddIn.csproj
// Project Item Name:         InvoicePanel.cs
// Project Item Filename:     InvoicePanel.cs
// Project Item FullFilename: C:\Desarrollo\OffInvoiceWordAddIn\InvoicePanel.cs
// Project Item Kind:         Código
// Purpose:                   
//Copyright © 2009 - 2010 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Outlook = Microsoft.Office.Interop.Outlook;
using Microsoft.Office.Interop.Outlook;
using System.IO;
using System.Globalization;
using OffInvoiceWordAddIn.XmlMngFiles;
using OffInvoiceWordAddIn.FacturaeFiles;
using System.Xml;

namespace OffInvoiceWordAddIn
{
    /// <summary>
    /// Control de usuario personalizado para mostrar la información de una factura en el taskpane.
    /// </summary>
    public partial class InvoicePanel : UserControl
    {
        #region "Fields"

        /// <summary>
        /// Campo que referencia al taskpane que lo contiene
        /// </summary>
        InvoiceTaskPane taskPane;

        /// <summary>
        /// Campo que referencia al parser que meneja la bitacora de gestión de facturas
        /// </summary>
        XmlFileMngParser parser;

        /// <summary>
        /// Variable de tipo string que almacena el valor del estado de una factura.
        /// </summary>
        string status = string.Empty;

        #endregion

        #region "Properties"

        /// <summary>
        /// Propiedad qe contiene el valor del paht de la factura
        /// </summary>
        public string InvoicePath { get; set; }

        #endregion

        #region "Constructors"

        /// <summary>
        /// Constructor que inicializa todos los componentes gráficos del control.
        /// </summary>
        /// <param name="taskPane">Parámetro de tipo InvoiceTaskPane que contiene la referencia al task pane</param>
        /// <param name="status">Parámetro de tipo string que contiene el estado</param>
        public InvoicePanel(InvoiceTaskPane taskPane,string status)
        {
            InitializeComponent();
            LoadLanguage();
            this.taskPane = taskPane;
            this.status=status;
            this.parser = new XmlFileMngParser();


        }

        #endregion

        #region Event Handler

        /// <summary>
        /// Método que maneja el evento que se produce cuando el raton entra en el ámbito del control
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InvoicePanel_MouseEnter(object sender, EventArgs e)
        {
            seleccionarFactura();
        }

        /// <summary>
        /// Método que maneja el evento que se produce cuando el raton sale del ámbito del control
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InvoicePanel_MouseLeave(object sender, EventArgs e)
        {
            deseleccionarFactura();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// visualizar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void visualizarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                visualizarFactura(true, false, false, "ISSUED");
            }
            catch (System.Exception ex)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// reenviar del menu contextual.Abre el gestor de correo Outlook y adjunta la factura para su envio
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void reenviarFacturaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Microsoft.Office.Interop.Outlook.Application outlook = new Outlook.Application();
                Outlook.MailItem oMsg = (Outlook.MailItem)outlook.CreateItem(Outlook.OlItemType.olMailItem);
                oMsg.Subject = "Envio de Facturae";
                oMsg.BodyFormat = OlBodyFormat.olFormatRichText;
                oMsg.Body = " ";
                object sSource = string.Empty;

                sSource = this.InvoicePath;

                    if (!File.Exists(sSource.ToString()))
                    {
                        ControlMessages msg = ControlMessages.getInstance();
                        MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorMngFileNotFound), msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Error);
                        oMsg = null;
                        outlook.Quit();
                        outlook = null;
                        return;
                    }
                
                object sDisplayName = "Mi asunto";
                object iPosition = (int)(oMsg.Body.Length + 1);
                object iAttachType = Outlook.OlAttachmentType.olByValue;
                Outlook.Attachment oAttach = oMsg.Attachments.Add(sSource, iAttachType, iPosition, sDisplayName);                
                oMsg.Display(true);  
            }
            catch (System.Exception)
            {

                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorOutlook), msg.getMessage(ControlMessages.Msg.CaptionOutlook), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// nueva factura a partir de esta del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void nuevaFacturaAPartirDeEstaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string facturaBasePath = this.InvoicePath;


            try
            {
                if (!string.IsNullOrEmpty(facturaBasePath))
                {
                    if (!File.Exists(facturaBasePath))
                    {
                        ControlMessages controlM = ControlMessages.getInstance();
                        MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorFileNotFound), controlM.getMessage(ControlMessages.Msg.CaptionCorrectiveInvoice), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                    else
                    {
                        object missing = System.Reflection.Missing.Value;
                        object visible = true;
                        object docPath = facturaBasePath;
                        object doNotsaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;                     

                        string temporalPath = Path.GetTempFileName();

                        try
                        {
                            Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotsaveChanges, ref missing, ref missing);
                        }
                        catch (System.Exception)
                        {
                        }

                        Globals.ThisAddIn.Application.Documents.Open(ref docPath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref visible, ref missing, ref missing, ref missing, ref missing);

                        //COMPROBAR EL TIPO DE LA FACTURA SI ES PAPEL SE GENERA SE GUARDA Y SE IMPORTA EN LA NUEVA PLANTILLA, SI ES ELECTRONICA SE EXTRAE Y SE IMPORTA

                        ExportController export = new ExportController();
                        if (this.getInvoiceType().ToUpper().Equals("(P)"))
                        {
                            export.exportPaperInvoice(temporalPath, false);
                        }
                        else if (this.getInvoiceType().ToUpper().Equals("(E)"))
                        {
                            export.extraerfacturae(temporalPath, false);
                        }

                        LoadController load = new LoadController();
                        //load.LoadFacturae(temporalPath, false, true, false);
                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        try
                        {
                            doc.Load(temporalPath);
                        }
                        catch (System.Exception)
                        {

                            throw new System.Exception(ControlMessages.Msg.XmlMalformed.ToString("g"));
                        }
                        if (doc.DocumentElement.NamespaceURI.Equals("urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"))
                        {
                            load.LoadUBL(temporalPath, true, false, false);
                        }
                        else if (doc.DocumentElement.NamespaceURI.Equals("urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:1"))
                        {
                            load.LoadCII(temporalPath, true, false, false);
                        }
                        else
                        {
                            load.LoadFacturae(temporalPath, false, true, false);

                        }

                        Globals.ThisAddIn.setControlValue(ControlList.Tag.IH_InvoiceNumber, string.Empty);
                        Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceNumber, string.Empty);
                        Globals.ThisAddIn.setControlValue(ControlList.Tag.CORR_InvoiceSeriesCode, string.Empty);
                        Globals.ThisAddIn.setControlValue(ControlList.Tag.Status,"DRAFT");
                        Globals.ThisAddIn.updateStatus(false, false, true);

                        TemplateController template = new TemplateController();
                        template.enumerateTables();
                        Globals.ThisAddIn.Application.ActiveDocument.Tables[template.t4].Rows[2].Range.Text = string.Empty;
                        

                        File.Delete(temporalPath);

                    }


                }

            }
            catch (System.Exception) { }


        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// generar factura rectificativa del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void facturaRectificativaToolStripMenuItem_Click(object sender, EventArgs e)
        {

            string docToRectificatePath = this.InvoicePath;

            rectificarFactura(docToRectificatePath);
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// marcar como cobrada del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cobradaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //CultureInfo cult = new CultureInfo("es-ES");
            CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            DateTime fecha = Convert.ToDateTime(lbDate.Text, cult);
            string serie=lbSerieNumFac.Text.Substring(0,lbSerieNumFac.Text.IndexOf('-'));
            string numFac=lbSerieNumFac.Text.Substring(lbSerieNumFac.Text.IndexOf('-')+1);
            string pathFact = Globals.ThisAddIn.EnvironmentVariable + Paths.IssuedPath + fecha.Year + fecha.Month + ".xml";
            parser.updateChangeMarca(serie, numFac, lbNif.Text, "COBRADA", pathFact);
            rechazadaToolStripMenuItem.Checked = false;
            cobradaToolStripMenuItem.Checked = true;
            Language l = Language.getInstance();
            lbMarca.Text = l.getLabels("lbCobrada");

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// marcar como rechazada del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rechazadaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //CultureInfo cult = new CultureInfo("es-ES");
            CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            DateTime fecha = Convert.ToDateTime(lbDate.Text, cult);
            string serie = lbSerieNumFac.Text.Substring(0, lbSerieNumFac.Text.IndexOf('-'));
            string numFac = lbSerieNumFac.Text.Substring(lbSerieNumFac.Text.IndexOf('-') + 1);
            string pathFact = Globals.ThisAddIn.EnvironmentVariable + Paths.IssuedPath + fecha.Year + fecha.Month + ".xml";
            parser.updateChangeMarca(serie, numFac, lbNif.Text, "RECHAZADA", pathFact);
            cobradaToolStripMenuItem.Checked = false;
            rechazadaToolStripMenuItem.Checked = true;
            Language l = Language.getInstance();
            lbMarca.Text = l.getLabels("lbRechazada");
            lbMarca.Visible = true;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// eliminar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void eliminarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            removeInvoice(Globals.ThisAddIn.EnvironmentVariable + Paths.IssuedPath);
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// visualizar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void visualizarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            try
            {
                visualizarFactura(false, true, false, "RECEIVED");
            }
            catch (System.Exception ex)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// marcar como pagada del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cobradaToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //CultureInfo cult = new CultureInfo("es-ES");
            CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            DateTime fecha = Convert.ToDateTime(lbDate.Text, cult);
            string serie = lbSerieNumFac.Text.Substring(0, lbSerieNumFac.Text.IndexOf('-'));
            string numFac = lbSerieNumFac.Text.Substring(lbSerieNumFac.Text.IndexOf('-') + 1);
            string pathFact = Globals.ThisAddIn.EnvironmentVariable + Paths.ReceivedPath + fecha.Year + fecha.Month + ".xml";
            parser.updateChangeMarca(serie, numFac, lbNif.Text, "PAGADA", pathFact);
            rechazadaToolStripMenuItem1.Checked = false;
            cobradaToolStripMenuItem1.Checked = true;
            Language l = Language.getInstance();
            lbMarca.Text = l.getLabels("lbPagada");
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// marcar como rechazada del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rechazadaToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //CultureInfo cult = new CultureInfo("es-ES");
            CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            DateTime fecha = Convert.ToDateTime(lbDate.Text, cult);
            string serie = lbSerieNumFac.Text.Substring(0, lbSerieNumFac.Text.IndexOf('-'));
            string numFac = lbSerieNumFac.Text.Substring(lbSerieNumFac.Text.IndexOf('-') + 1);
            string pathFact = Globals.ThisAddIn.EnvironmentVariable + Paths.ReceivedPath + fecha.Year + fecha.Month + ".xml";
            parser.updateChangeMarca(serie, numFac, lbNif.Text, "RECHAZADA", pathFact);
            rechazadaToolStripMenuItem1.Checked = true;
            cobradaToolStripMenuItem1.Checked = false;
            Language l = Language.getInstance();
            lbMarca.Text = l.getLabels("lbRechazada");
 
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// eliminar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void eliminarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            removeInvoice(Globals.ThisAddIn.EnvironmentVariable + Paths.ReceivedPath);
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// visualizar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void visualizarToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            try
            {
                visualizarFactura(false, false, true, "DRAFT");
            }
            catch (System.Exception ex)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre la opción de
        /// eliminar del menu contextual.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void eliminarToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            removeInvoice(Globals.ThisAddIn.EnvironmentVariable + Paths.DraftPath);
        }

        /// <summary>
        /// Método que maneja el evento que se produce al mostrarse el control.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InvoicePanel_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer doble click sobre el control.
        /// Se encarga de visualizar la factura
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InvoicePanel_DoubleClick(object sender, EventArgs e)
        {
            bool issued = false;
            bool received = false;
            bool draft = false;
            switch (status)
            {
                case "ISSUED": issued = true; break;
                case "RECEIVED": received = true; break;
                case "DRAFT": draft = true; break;
                default:
                    break;
            }

            try
            {
                visualizarFactura(issued, received, draft, status);
            }
            catch (System.Exception ex)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(ex.Message, msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce cuando el puntero del raton entra en el ámbito del control.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbSerieNumFac_MouseEnter(object sender, EventArgs e)
        {
            seleccionarFactura();
        }

        /// <summary>
        /// Método que maneja el evento que se produce cuando el puntero del raton entra en el ámbito de la etiqueta nombre.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbName_Enter(object sender, EventArgs e)
        {
            seleccionarFactura();
        }

        /// <summary>
        /// Método que maneja el evento que se produce cuando se hace click en el control.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InvoicePanel_Click(object sender, EventArgs e)
        {
            taskPane.CerrarMenusContextuales();
        }


        /// <summary>
        /// Método que maneja el evento que se produce cuando se abre el submenu del menú marcar.
        /// Se encarga de activar el checkbox que corresponda dependiendo de la marca.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void marcarComoToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            Language l = Language.getInstance();
            if (lbMarca.Text.Equals(l.getLabels("lbCobrada")))
            {
                cobradaToolStripMenuItem.Checked = true;
                rechazadaToolStripMenuItem.Checked = false;
            }
            else if (lbMarca.Text.Equals(l.getLabels("lbRechazada")))
            {
                cobradaToolStripMenuItem.Checked = false;
                rechazadaToolStripMenuItem.Checked = true;
            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce cuando se abre el submenu del menú marcar.
        /// Se encarga de activar el checkbox que corresponda dependiendo de la marca.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void marcarComoCobradaToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            Language l = Language.getInstance();
            if (lbMarca.Text.Equals(l.getLabels("lbPagada")))
            {
                cobradaToolStripMenuItem1.Checked = true;
                rechazadaToolStripMenuItem1.Checked = false;
            }
            else if (lbMarca.Text.Equals(l.getLabels("lbRechazada")))
            {
                cobradaToolStripMenuItem1.Checked = false;
                rechazadaToolStripMenuItem1.Checked = true;
            }
        }

        #endregion

        #region public methods


        /// <summary>
        /// Método que abre la factura docx seleccionada
        /// </summary>
        /// <param name="issued">Parámetro de tipo bool que indica si el estado de la factura es emitida</param>
        /// <param name="receive">Parámetro de tipo bool que indica si el estado de la factura es recibida</param>
        /// <param name="draft">Parámetro de tipo bool que indica si el estado de la factura es borrador</param>
        /// <param name="status">Parámetro de tipo string que indica el estado actual</param>
        public void visualizarFactura(bool issued, bool receive, bool draft, string status)
        {
            object missing = System.Reflection.Missing.Value;
            object doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;

            object path = this.InvoicePath;

            if (File.Exists(path.ToString()))
            {
                try
                {
                    Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotSaveChanges, ref missing, ref missing);
                }
                catch (System.Exception)
                {
                }


                Globals.ThisAddIn.Application.Documents.Open(ref path,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing);
                Globals.ThisAddIn.updateStatusCheck(issued, receive, draft, status);
            }
            else
            {

                ControlMessages msg = ControlMessages.getInstance();
                throw new System.Exception(msg.getMessage(ControlMessages.Msg.ErrorMngFileNotFound));
            }
        }


        /// <summary>
        /// Método que elimina una factura del archivo de gestión y la borra del disco
        /// </summary>
        /// <param name="pathRegister">Parámetro de tipo string con el paht de la factura</param>
        public void removeInvoice(string pathRegister)
        {

            try
            {
                ControlMessages msg = ControlMessages.getInstance();
                if (MessageBox.Show(msg.getMessage("InfoDeleteSure"), msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    string serie = this.GetSerieNumFac().Substring(0, this.GetSerieNumFac().LastIndexOf("-"));
                    string numFac = this.GetSerieNumFac().Substring(this.GetSerieNumFac().LastIndexOf("-") + 1);
                    string cif = this.GetNif();

                    //CultureInfo cult = new CultureInfo("es-Es");
                    CultureInfo cult = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
                    DateTime fecha = DateTime.Parse(this.GetDate(), cult);

                    string path = pathRegister + fecha.Year.ToString() + fecha.Month.ToString() + ".xml";
                    parser.removeInvoive(serie, numFac, cif, path);

                    taskPane.getFlowLayoutPanel().Controls.Remove(this);
                }

            }
            catch (System.Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorFileOpenNoDelete), msg.getMessage(ControlMessages.Msg.CaptionActionPane), MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }


        }

        /// <summary>
        /// Método que inicializa el tipo de menú contextual al de emitidas
        /// </summary>
        public void setIssuedContextMenu()
        {
            this.ContextMenuStrip = this.cmsIssuedInvoice;
        }

        /// <summary>
        /// Método que inicializa el tipo de menú contextual al de recibidas
        /// </summary>
        public void setReceivedContextMenu()
        {
            this.ContextMenuStrip = this.cmsReceivedInvoice;
        }

        /// <summary>
        /// Método que inicializa el tipo de menú contextual al de borradores
        /// </summary>
        public void setDraftContextMenu()
        {
            this.ContextMenuStrip = this.cmsDraftInvoice;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta serie y numero de factura.
        /// </summary>
        /// <param name="value">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetSerieNumFac(string value)
        {
            lbSerieNumFac.Text = value;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta nombre.
        /// </summary>
        /// <param name="value">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetName(string value)
        {
            lbName.Text = value;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta fecha.
        /// </summary>
        /// <param name="value">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetDate(string value)
        {
            lbDate.Text = value;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta NIF.
        /// </summary>
        /// <param name="value">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetNif(string value)
        {
            lbNif.Text = value;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta importe total de la factura.
        /// </summary>
        /// <param name="value">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetTotal(string value)
        {
            lbTotal.Text = string.Concat("€"," ",value);
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta marca (Emitida, Recibida, Borrador, Pagada, Cobrada, Rechazada).
        /// </summary>
        /// <param name="marca">Parámetro de tipo String con el valor de la etiqueta</param>
        public void SetMarca(string marca) 
        {
            lbMarca.Text = marca;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta serie y numero de factura
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetSerieNumFac( )
        {
            return lbSerieNumFac.Text;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta nombre
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetName( )
        {
            return lbName.Text;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta fecha
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetDate( )
        {
            return lbDate.Text;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta NIF
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetNif( )
        {
            return lbNif.Text;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta importe total de la factura.
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetTotal( )
        {
            return lbTotal.Text;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta marca.
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string GetMarca() 
        {
            return lbMarca.Text;
        }

        /// <summary>
        /// Método que asigna el texto de la etiqueta tipo de factura (Papel (P), Electrónica (E)).
        /// </summary>
        /// <param name="type">Parámetro de tipo String con el valor de la etiqueta</param>
        public void setInvoiceType(string type)        {
            
            lblInvoiceType.Text = type;
        }

        /// <summary>
        /// Método que devuelve el texto de la etiqueta tipo de factura (Papel (P), Electrónica (E))
        /// </summary>
        /// <returns>Texto de la etiqueta</returns>
        public string getInvoiceType()
        {
            return lblInvoiceType.Text;
        }

        /// <summary>
        /// Método que devuelve una referencia de la etiqueta tipo de factura.
        /// </summary>
        /// <returns>Referencia a la etiqueta tipo de factura</returns>
        public Label getLabelINvoiceType() 
        {
            return lblInvoiceType;
        }

        /// <summary>
        /// Método que cambia el color del fondo del contol para conseguir un efecto de selección
        /// </summary>
        public void seleccionarFactura()
        {
            this.BackgroundImage = global::OffInvoiceWordAddIn.Properties.Resources.imageMouseOver;
            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
        }

        /// <summary>
        /// Método que cambia el color del fondo del contol para conseguir un efecto de selección
        /// </summary>
        public void deseleccionarFactura()
        {
            this.BackgroundImage = global::OffInvoiceWordAddIn.Properties.Resources.imageMouseout;
            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
        }

        /// <summary>
        /// Método que se encarga de cerrar el menú contextual que este visible cuando se hace click fuera de él.
        /// </summary>
        public void CerrarContextMenus()
        {
            if (cmsIssuedInvoice != null)
            {
                cmsIssuedInvoice.Close();
            }
            if (cmsReceivedInvoice != null)
            {
                cmsReceivedInvoice.Close();
            }
            if (cmsDraftInvoice != null)
            {
                cmsDraftInvoice.Close();
            }
        }


        /// <summary>
        /// Método que se encarga de abrir una facura para su rectificacion.
        /// </summary>
        /// <param name="docToRectPath">Parámetro de tipo string que contiene el paht de la factura</param>
        public void rectificarFactura(string docToRectPath)
        {
            try
            {
                if (!string.IsNullOrEmpty(docToRectPath))
                {
                    if (!File.Exists(docToRectPath))
                    {
                        ControlMessages controlM = ControlMessages.getInstance();
                        MessageBox.Show(controlM.getMessage(ControlMessages.Msg.ErrorFileNotFound), controlM.getMessage(ControlMessages.Msg.CaptionCorrectiveInvoice), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                    else
                    {
                        object missing = System.Reflection.Missing.Value;
                        object visible = true;
                        object docPath = docToRectPath;
                        object doNotsaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
                        //object correctiveTemplate = Paths.TemplatePath + TemplatesDirectories + "CorrectiveTemplate.dotx";
                        string temporalPath = Path.GetTempFileName();

                        try
                        {
                            Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotsaveChanges, ref missing, ref missing);
                        }
                        catch (System.Exception)
                        {
                        }

                        Globals.ThisAddIn.Application.Documents.Open(ref docPath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref visible, ref missing, ref missing, ref missing, ref missing);

                        ExportController export = new ExportController();
                        if (this.getInvoiceType().ToUpper().Equals("(P)"))
                        {
                            export.exportPaperInvoice(temporalPath, false);
                        }
                        else if (this.getInvoiceType().ToUpper().Equals("(E)"))
                        {
                            export.extraerfacturae(temporalPath, false);
                        }

                        try
                        {
                            Globals.ThisAddIn.getControlByTag(ControlList.Tag.SP_CountryCode).DropdownListEntries.Clear();
                            Globals.ThisAddIn.getControlByTag(ControlList.Tag.BP_CountryCode).DropdownListEntries.Clear();
                            //getControlByTag(ControlList.Tag.TH_CountryCode).DropdownListEntries.Clear();
                        }
                        catch (System.Exception) { }

                        try
                        {
                            string[] data = { "Afganistán", "AFG", "Albania", "ALB", "Alemania", "DEU", "Andorra", "AND", "Angola", "AGO", "Anguilla", "AIA", "Antigua y Barbuda", "ATG", "Antillas Holandesas", "ANT", "Arabia Saudí", "SAU", "Argelia", "DZA", "Argentina", "ARG", "Armenia", "ARM", "Aruba", "ABW", "ARY Macedonia", "MKD", "Australia", "AUS", "Austria", "AUT", "Azerbaiyán", "AZE", "Bahamas", "BHS", "Bahréin", "BHR", "Bangladesh", "BGD", "Barbados", "BRB", "Bélgica", "BEL", "Belice", "BLZ", "Benin", "BEN", "Bermudas", "BMU", "Bhután", "BTN", "Bielorrusia", "BLR", "Bolivia", "BOL", "Bosnia y Herzegovina", "BIH", "Botsuana", "BWA", "Brasil", "BRA", "Brunéi", "BRN", "Bulgaria", "BGR", "Burkina Faso", "BFA", "Burundi", "BDI", "Cabo Verde", "CPV", "Camboya", "KHM", "Camerún", "CMR", "Canadá", "CAN", "Chad", "TCD", "Chile", "CHL", "China", "CHN", "Chipre", "CYP", "Ciudad del Vaticano", "VAT", "Colombia", "COL", "Comoras", "COM", "Congo", "COG", "Corea del Norte", "PRK", "Corea del Sur", "KOR", "Costa de Marfil", "CIV", "Costa Rica", "CRI", "Croacia", "HRV", "Cuba", "CUB", "Dinamarca", "DNK", "Dominica", "DMA", "Ecuador", "ECU", "Egipto", "EGY", "El Salvador", "SLV", "Emiratos Árabes Unidos", "ARE", "Eritrea", "ERI", "Eslovaquia", "SVK", "Eslovenia", "SVN", "España", "ESP", "Estados Unidos", "USA", "Estonia", "EST", "Etiopía", "ETH", "Filipinas", "PHL", "Finlandia", "FIN", "Fiyi", "FJI", "Francia", "FRA", "Gabón", "GAB", "Gambia", "GMB", "Georgia", "GEO", "Ghana", "GHA", "Gibraltar", "GIB", "Granada", "GRD", "Grecia", "GRC", "Groenlandia", "GRL", "Guadalupe", "GLP", "Guam", "GUM", "Guatemala", "GTM", "Guayana Francesa", "GUF", "Guernsey", "GGY", "Guinea", "GIN", "Guinea Ecuatorial", "GNQ", "Guinea-Bissau", "GNB", "Guyana", "GUY", "Haití", "HTI", "Honduras", "HND", "Hong Kong", "HKG", "Hungría", "HUN", "India", "IND", "Indonesia", "IDN", "Irán", "IRN", "Iraq", "IRQ", "Irlanda", "IRL", "Isla de Man", "IMN", "Isla Norfolk", "NFK", "Islandia", "ISL", "Islas Caimán", "CYM", "Islas Cook", "COK", "Islas Feroe", "FRO", "Islas Malvinas", "FLK", "Islas Marianas del Norte", "MNP", "Islas Marshall", "MHL", "Islas Pitcairn", "PCN", "Islas Salomón", "SLB", "Islas Turcas y Caicos", "TCA", "Islas Vírgenes Británicas", "VGB", "Islas Vírgenes de los Estados Unidos", "VIR", "Israel", "ISR", "Italia", "ITA", "Jamaica", "JAM", "Japón", "JPN", "Jersey", "JEY", "Jordania", "JOR", "Kazajstán", "KAZ", "Kenia", "KEN", "Kirguistán", "KGZ", "Kiribati", "KIR", "Kuwait", "KWT", "Laos", "LAO", "Lesotho", "LSO", "Letonia", "LVA", "Líbano", "LBN", "Liberia", "LBR", "Libia", "LBY", "Liechtenstein", "LIE", "Lituania", "LTU", "Luxemburgo", "LUX", "Macao", "MAC", "Madagascar", "MDG", "Malasia", "MYS", "Malawi", "MWI", "Maldivas", "MDV", "Malí", "MLI", "Malta", "MLT", "Marruecos", "MAR", "Martinica", "MTQ", "Mauricio", "MUS", "Mauritania", "MRT", "Mayotte", "MYT", "México", "MEX", "Micronesia", "FSM", "Moldavia", "MDA", "Mónaco", "MCO", "Mongolia", "MNG", "Montenegro", "MNE", "Montserrat", "MSR", "Mozambique", "MOZ", "Myanmar", "MMR", "Namibia", "NAM", "Nauru", "NRU", "Nepal", "NPL", "Nicaragua", "NIC", "Níger", "NER", "Nigeria", "NGA", "Niue", "NIU", "Noruega", "NOR", "Nueva Caledonia", "NCL", "Nueva Zelanda", "NZL", "Omán", "OMN", "Países Bajos", "NLD", "Pakistán", "PAK", "Palau", "PLW", "Palestina", "PSE", "Panamá", "PAN", "Papúa Nueva Guinea", "PNG", "Paraguay", "PRY", "Perú", "PER", "Polinesia Francesa", "PYF", "Polonia", "POL", "Portugal", "PRT", "Puerto Rico", "PRI", "Qatar", "QAT", "Reino Unido", "GBR", "República Centroafricana", "CAF", "República Checa", "CZE", "República Democrática del Congo", "COD", "República Dominicana", "DOM", "Reunión", "REU", "Ruanda", "RWA", "Rumania", "ROU", "Rusia", "RUS", "Sahara Occidental", "ESH", "Samoa", "WSM", "Samoa Americana", "ASM", "San Cristóbal y Nevis", "KNA", "San Marino", "SMR", "San Pedro y Miquelón", "SPM", "San Vicente y las Granadinas", "VCT", "Santa Helena", "SHN", "Santa Lucía", "LCA", "Santo Tomé y Príncipe", "STP", "Senegal", "SEN", "Serbia", "SRB", "Seychelles", "SYC", "Sierra Leona", "SLE", "Singapur", "SGP", "Siria", "SYR", "Somalia", "SOM", "Sri Lanka", "LKA", "Suazilandia", "SWZ", "Sudáfrica", "ZAF", "Sudán", "SDN", "Suecia", "SWE", "Suiza", "CHE", "Surinam", "SUR", "Svalbard y Jan Mayen", "SJM", "Tailandia", "THA", "Taiwán", "TWN", "Tanzania", "TZA", "Tayikistán", "TJK", "Timor Oriental", "TLS", "Togo", "TGO", "Tokelau", "TKL", "Tonga", "TON", "Trinidad y Tobago", "TTO", "Túnez", "TUN", "Turkmenistán", "TKM", "Turquía", "TUR", "Tuvalu", "TUV", "Ucrania", "UKR", "Uganda", "UGA", "Uruguay", "URY", "Uzbekistán", "UZB", "Vanuatu", "VUT", "Venezuela", "VEN", "Vietnam", "VNM", "Wallis y Futuna", "WLF", "Yemen", "YEM", "Yibuti", "DJI", "Zaire", "ZAR", "Zambia", "ZMB", "Zimbabue", "ZWE" };
                            int index = 0;

                            for (int i = 0; i < data.Length; i++)
                            {
                                Globals.ThisAddIn.getControlByTag(ControlList.Tag.SP_CountryCode).DropdownListEntries.Add(data[i], data[i + 1], index);
                                Globals.ThisAddIn.getControlByTag(ControlList.Tag.BP_CountryCode).DropdownListEntries.Add(data[i], data[i + 1], index);
                                //getControlByTag(ControlList.Tag.TH_CountryCode).DropdownListEntries.Add(data[i], data[i + 1], index);
                                i++; index++;
                            }

                        }
                        catch (System.Exception)
                        { }

                        LoadController load = new LoadController();
                        //load.LoadFacturae(temporalPath, true, true, false);

                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        try
                        {
                            doc.Load(temporalPath);
                        }
                        catch (System.Exception)
                        {

                            throw new System.Exception(ControlMessages.Msg.XmlMalformed.ToString("g"));
                        }
                        if (doc.DocumentElement.NamespaceURI.Equals("urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"))
                        {
                            load.LoadUBL(temporalPath, true, true, false);
                        }
                        else if (doc.DocumentElement.NamespaceURI.Equals("urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:1"))
                        {
                            load.LoadCII(temporalPath, true, true, false);
                        }
                        else
                        {
                            load.LoadFacturae(temporalPath, true, true, false);

                        }

                        Globals.ThisAddIn.setControlValue(ControlList.Tag.Status, "DRAFT");
                        Globals.ThisAddIn.updateStatus(false, false, true);
                        TemplateController template = new TemplateController();
                        template.enumerateTables();
                        Globals.ThisAddIn.Application.ActiveDocument.Tables[template.t4].Rows[2].Range.Text = string.Empty;

                        File.Delete(temporalPath);

                    }


                }

            }
            catch (System.Exception) { }
        }


        private void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                visualizarToolStripMenuItem.Text = labels.getLabels(visualizarToolStripMenuItem.Name);
                reenviarFacturaToolStripMenuItem.Text = labels.getLabels(reenviarFacturaToolStripMenuItem.Name);
                generarToolStripMenuItem.Text = labels.getLabels(generarToolStripMenuItem.Name);
                nuevaFacturaAPartirDeEstaToolStripMenuItem.Text = labels.getLabels(nuevaFacturaAPartirDeEstaToolStripMenuItem.Name);
                facturaRectificativaToolStripMenuItem.Text = labels.getLabels(facturaRectificativaToolStripMenuItem.Name);
                marcarComoToolStripMenuItem.Text = labels.getLabels(marcarComoToolStripMenuItem.Name);
                cobradaToolStripMenuItem.Text = labels.getLabels(cobradaToolStripMenuItem.Name);
                rechazadaToolStripMenuItem.Text = labels.getLabels(rechazadaToolStripMenuItem.Name);
                eliminarToolStripMenuItem.Text = labels.getLabels(eliminarToolStripMenuItem.Name);
                visualizarToolStripMenuItem1.Text = labels.getLabels(visualizarToolStripMenuItem1.Name);
                marcarComoCobradaToolStripMenuItem.Text = labels.getLabels(marcarComoCobradaToolStripMenuItem.Name);
                cobradaToolStripMenuItem1.Text = labels.getLabels(cobradaToolStripMenuItem1.Name);
                rechazadaToolStripMenuItem1.Text = labels.getLabels(rechazadaToolStripMenuItem1.Name);
                eliminarToolStripMenuItem1.Text = labels.getLabels(eliminarToolStripMenuItem1.Name);
                visualizarToolStripMenuItem2.Text = labels.getLabels(visualizarToolStripMenuItem2.Name);
                eliminarToolStripMenuItem2.Text = labels.getLabels(eliminarToolStripMenuItem2.Name);
            }
            catch (System.Exception)
            {

                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        #endregion

        
        
        



    }
}
